// 包声明 - main包是Go程序的入口包
package main

// 导入errors包，用于创建错误对象
import "errors"
// 导入fmt包，用于格式化输入输出
import "fmt"

// 函数定义格式：func 函数名(参数列表) (返回值列表) {
//     函数体
// }

// 1. 无返回值函数
// 定义了一个名为fun1的函数，没有参数，也没有返回值
func fun1() {
  // return语句用于结束函数执行
  // 在无返回值函数中，return可以省略
  return // 也可以不写
}

// 2. 单返回值函数
// 定义了一个名为fun2的函数，返回类型为int
func fun2() int {
  // 返回一个整数值1
  return 1
}

// 3. 多返回值函数
// 定义了一个名为fun3的函数，返回一个int和一个error
// Go语言支持多个返回值，这在处理错误时特别有用
func fun3() (int, error) {
  // 返回两个值：0和一个新创建的错误对象
  return 0, errors.New("错误")
}

// 4. 命名返回值函数
// 定义了一个名为fun4的函数，返回类型为string，并为返回值命名为res
func fun4() (res string) {
  // 在命名返回值函数中，可以直接return
  // 这会返回已经命名的返回值（这里是res）
  return // 相当于先定义再赋值，res的默认值是空字符串
  // 也可以显式返回一个值：return "abc"
}

// main函数 - Go程序的入口函数
func main() {
  // 5. 匿名函数（没有函数名的函数）
  // 定义了一个名为add的变量，其类型是函数
  // 这个函数接受两个int类型的参数，返回一个int类型的值
  var add = func(a, b int) int {
    return a + b
  }
  
  // 调用匿名函数并输出结果
  fmt.Println(add(1, 2))  // 输出: 3
  
  // 6. 带参数的函数示例
  // 定义一个计算两数之和的函数
  sum := calculateSum(5, 3)
  fmt.Println("5 + 3 =", sum)  // 输出: 5 + 3 = 8
  
  // 7. 调用多返回值函数
  result, err := divide(10, 2)
  if err != nil {
    fmt.Println("错误:", err)
  } else {
    fmt.Println("10 / 2 =", result)
  }
  
  // 错误处理示例
  result, err = divide(10, 0)
  if err != nil {
    fmt.Println("错误:", err)
  } else {
    fmt.Println("10 / 0 =", result)
  }
}

// 带参数的函数示例
// 定义一个函数，接受两个int类型的参数，返回它们的和
func calculateSum(a, b int) int {
  return a + b
}

// 错误处理示例函数
// 定义一个函数，尝试将两个整数相除
// 如果除数为0，则返回错误
func divide(a, b int) (float64, error) {
  if b == 0 {
    // 如果除数为0，返回错误
    return 0, errors.New("除数不能为零")
  }
  // 计算并返回结果
  return float64(a) / float64(b), nil
}